package com.内部类.局部内部类;

public class Local_Inner_Class {
    /**1.局部内部类：定义在外部类中的局部位置上  如方法中，*/
    /**2.局部内部类可以直接调用(访问)外部类的所有成员，包括私有的*/
    /**3.局部内部类不能添加访问修饰符，例如public private等   但可以添加final修饰符表示不能继承；*/
    /**4.局部内部类也能继承*/
    /**5.局部内部类作用域： 仅仅在定义它的方法或代码块中 */
    /**6.外部类调用局部内部类的属性需要创建一个对象再调用 */
    /**7.当外部类和内部类的属性名相同时，访问属性会遵循就近原则，如果想要调用外部类的属性用 外部类名.this.属性 访问 */




    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.m1();
        /**1.创建外部类Outer 调用外部类Outer的m1方法
         * 2.进入到m1（），先定义局部内部类Inner01
         * 3.创建对象Inner01 再调用方法i1()
         * 4.进入到i1()方法，先输出 局部内部类的i2()方法  再输出外部类的n1属性
         * 5.定义内部类Inner02继承Inner01
         * 6.创建对象Inner02 再调用方法i2()
         * 7.进入到i2()方法，输出 局部内部类的i2()方法
         * 退出m1()方法，退出Outer类
         * */
        System.out.println("------------------------------");
        new Outer01().f1();
    }
}

class Outer {  // 外部类
    private int n1 = 10;
    public void m2(){
        System.out.println("外部类的m2方法");
    }

    /**1.局部内部类：定义在外部类中的局部位置上  如方法中，*/
    public void m1() {

        class Inner01{  // 局部内部类(本质上还是一个类)
            /**2.局部内部类可以访问外部类的所有成员，包括私有的*/
            public void i1() {
                System.out.println("局部内部类的i1()方法");
                System.out.println("n1 = "+n1);  // 可以访问外部类的成员变量
                //m2();  // 可以访问外部类的方法
            }
        }
        Inner01 inner = new Inner01();  // 创建对象
        inner.i1();  // 调用方法


        /**3.局部内部类不能添加访问修饰符，例如public private等   但可以添加final修饰符表示不能继承；*/
        class Inner02 extends Inner01{
            /**4.局部内部类也能继承*/
            public void i2() {
                System.out.println("局部内部类的i2()方法");
            }
        }

        /**6.外部类调用局部内部类的属性需要创建一个对象再调用 */
        Inner02 inner02 = new Inner02();// 创建对象
        inner02.i2(); // 调用方法

    }

}


/**7.当外部类和内部类的属性名相同时，访问属性会遵循就近原则，如果想要调用外部类的属性用 外部类名.this.属性 访问 */
class Outer01{
    private int n1 = 900;
    public void f1(){
        System.out.println("外部类Outer01的f1方法");

        class Inner01{
            private int n1 = 100;
            public void f2(){
                System.out.println("外部类Outer01的n1 = "+Outer01.this.n1 +"\t"+ "内部类Inner01的n1 = "+n1);
                /** Outer01.this.n1解读： Outer01.this本质上就是外部类的对象。
                 *  即 内部类Inner01 在谁的方法中就指向谁 因为内部类Inner01在OUter01的f1方法中，所以Outer01.this就指向Outer01*/
            }
        }

        Inner01 inner01 = new Inner01();
        inner01.f2();
    }


}